#!/usr/bin/python3
# -*- encoding: utf-8 -*-
'''
@File    :   getPic.py
@Time    :   2020/07/02 21:23:06
@Author  :   Qing Bei
@Version :   1.0
@Contact :   1013575196@qq.com
@License :   (C)Copyright 2017-2018, Liugroup-NLPR-CASIA
@Desc    :   爬取某瓣网站图片
'''
# here put the import lib
import re
import os
import sys

import urllib
from urllib import request

import you_get



'''
@name: getImgName
@msg: 获取图片名称和扩展名
@return: 图片名称和扩展名(str)
'''
def getImgName(url):
    # 路径存在判断和创建
    if not os.path.isdir(savepath):
        os.mkdir(savepath)
    # str.rindex（str，beg=0 end=len（string））
    # 返回子字符串 str 在字符串中 最后出现 的位置
    # 如果没有匹配的字符串会报异常，可以指定可选参数[beg:end]设置查找的区间。
    # 不指定区间则默认查找区间则为整个字符串

    # 获取图片名字的位置的前一位作为索引，最后一个'\'号的位置
    begin = url.rindex('/')
    imageName = url[begin+1:]
    return imageName

# 下载函数，you-get库详情及使用: https://github.com/soimort/you-get/
def downloadImg(url, path):
    sys.argv = ['you-get', '-o', path, url]
    you_get.main()

def main():
    global savepath
    # 网页url
    url = 'https://www.douban.com/'
    # 请求头
    headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}
    savepath='G:\\DouBanImg'
    try:
        # 尝试请求
        req = request.Request(url=url, headers = headers)
        req.encoding="utf-8"

        # 返回值是一个http.client.HttpResponse对象
        page=request.urlopen(req)
        html=page.read().decode('utf-8')

        # 正则匹配图片链接并存储在imageurls列表中
        reg=r'(https://img[139][^\s]*?(png|jpg|gif|webp))'
        imag=re.compile(reg)
        imageurls=re.findall(imag, str(html))

        # 下载
        for eachItem in imageurls:
            # 获取图片名称和扩展名
            imagename = getImageName(eachItem[0])
            try:
                # 这个容易被反爬机制阻止
                # request.urlretrieve( imageurl,  imagename)

                downloadImg(eachItem[0], savepath)
                print(imagename, '\n 下载成功!')

            # 输出爬取失败错误 访问拒绝
            except ConnectionRefusedError as e:
                print(eachItem[0], '\n 下载失败!')

    except ConnectionRefusedError as RfError:
        print(f"{url}访问被拒绝")

if __name__ == "__main__":
    main()